package cn.xy.base.server.service;

import cn.xy.base.server.dto.SysAdminAddDTO;
import cn.xy.base.server.dto.SysAdminUpdateDTO;
import cn.xy.base.server.po.SysAdmin;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.po.RusticAdmin;
import com.rustic.server.vo.RusticAdminDetailVO;

import java.util.List;
import java.util.Map;

/**
 * 表[sys_admin]对应的服务类
 *
 * @author auto
 */

public interface SysAdminService extends IService<SysAdmin> {

    String SYS_ADMIN_NOT_EXIST = "管理员不存在";

    String ID = "id";
    String USERNAME = "username";
    String MOBILE = "mobile";
    String NICKNAME = "nickname";
    String EMAIL = "email";
    String PASSWORD = "password";
    String ROLE_ID = "roleId";

    /**
     * 根据Token获取管理员信息
     *
     * @param token      token
     * @param ignoreAuth 是否忽略权限
     * @return 管理员信息
     */
    SysAdmin getByToken(String token, boolean ignoreAuth);

    /**
     * 管理员登录
     *
     * @param adminId 管理员id
     * @param token   token
     * @param ip      ip地址
     */
    void login(int adminId, String token, String ip);

    /**
     * 管理员登出
     *
     * @param adminId 管理员id
     * @param token   token
     */
    void logout(int adminId, String token);

    /**
     * 管理员是否已登录
     *
     * @param adminId 管理员id
     * @param token   token
     * @return 是否已登录
     */
    boolean isLogin(int adminId, String token);

    /**
     * 管理员重新登录
     *
     * @param adminId 管理员id
     * @param token   token
     */
    void renewLogin(int adminId, String token);

    /**
     * 创建Jwt
     *
     * @param sysAdmin 管理员信息
     * @return jwt
     */
    String createJwt(SysAdmin sysAdmin);

    /**
     * 根据手机号获取管理员信息
     *
     * @param mobile 手机号
     * @return 管理员信息
     */
    SysAdmin getByMobile(String mobile);

    /**
     * 根据手机号和用户名获取管理员信息
     *
     * @param mobile   手机号
     * @param username 用户名
     * @return 管理员信息
     */
    SysAdmin getByMobileAndUsername(String mobile, String username);

    /**
     * 根据邮箱获取管理员信息
     *
     * @param email 邮箱
     * @return 管理员信息
     */
    SysAdmin getByEmail(String email);

    /**
     * 根据用户名获取管理员信息
     *
     * @param username 用户名
     * @return 管理员信息
     */
    SysAdmin getByUsername(String username);

    /**
     * 将密码进行加密
     *
     * @param password 密码
     * @param salt     盐
     * @return 加密后的密码
     */
    String encodePassword(String password, String salt);

    /**
     * 根据管理员id列表返回管理员列表信息
     *
     * @param sysAdminIdList 管理员id列表
     * @return 管理员列表信息
     */
    List<SysAdmin> listByIdIn(List<Integer> sysAdminIdList);

    /**
     * 根据名称或手机号搜索管理员
     *
     * @param keywords 关键词（名称或手机号）
     * @return 管理员列表
     */
    List<SysAdmin> searchByNameOrMobile(String keywords);

    /**
     * 管理员导入
     *
     * @param userImportList 导入用户数据
     * @return 结果
     */
    String adminImport(List<SysAdmin> userImportList);

    Map<Integer, SysAdmin> mapByIdList(List<Integer> adminIdList);

    /**
     * 添加乡村管理员或运营管理员
     *
     * @param sysAdminAddDTO 管理员信息
     * @param sysAdminAddDTO 操作人id
     */
    void addRusticOrOperation(SysAdminAddDTO sysAdminAddDTO, int adminId);

    /**
     * 更新乡村管理员或运营管理员
     *
     * @param sysAdminUpdateDTO 管理员更新信息
     * @param adminId           操作人id
     */
    void updateRusticOrOperation(SysAdminUpdateDTO sysAdminUpdateDTO, int adminId);

    /**
     * 获取乡村管理员的详情
     *
     * @param adminId 管理员id
     * @param rusticId 乡村id
     * @return RusticAdminDetailVO
     */
    RusticAdminDetailVO getRusticAdmin(int adminId, int rusticId);

    /**
     * 根据管理员id列表和用户账号查询
     * @param adminIdList 管理员id列表
     * @param username 用户账号
     * @return List<SysAdmin>
     */
    List<SysAdmin> listByIdsAndUsername(List<Integer> adminIdList, String username);
}
